package parserXML
{
	import flash.events.Event;

	/**
	 * Classe permettant de charger un fichier xml representant une salle room
	 * @see XmlObject
	 * @author Arnaud
	 */
	public class XmlRoom extends XmlObject
	{
		private var _id:String;

		private var _name:String;

		private var _murs:Vector.<Object>;

		private var _x_camera:int;

		private var _y_camera:int;

		/**
		 * Constructeur
		 * @param type Type du fichier xml
		 * @param path Chemin du fichier xml
		 */
		public function XmlRoom(type:String, path:String)
		{
			super(type, path);
			_murs=new Vector.<Object>;
			_id="";
			_name="";
		}

		/**
		 * Demarre le chargement du fichier xml
		 */
		public function chargementFichier():void
		{
			xmlLoader=new XmlLoader(this.path);
			xmlLoader.chargeur.addEventListener(Event.COMPLETE, createObject);
		}

		/**
		 * Charge le fichier xml et envoi un evenement XmlObject.CHARGEMENT_COMPLET
		 */
		private function createObject(e:Event):void
		{
			var xml:XML=new XML(xmlLoader.chargeur.data);

			//Chargement id et name
			this._id=String(xml.@id);
			this._name=String(xml.@name);
			//Chargement x et y camera
			this._x_camera=int(xml.StartLoc.Vertix.@x);
			this._y_camera=int(xml.StartLoc.Vertix.@y);

			//Chargement des murs
			var walls:XMLList=xml.Wall;
			for (var i:int=0; i < walls.length(); i++)
			{
				//Chargement des coordonnées du mur
				var mur:Array=new Array;
				var vertices:XMLList=walls[i].Vertix;
				var x1:Number=Number(vertices[0].@x);
				var y1:Number=Number(vertices[0].@y);
				var x2:Number=Number(vertices[1].@x);
				var y2:Number=Number(vertices[1].@y);

				mur[0]=x1;
				mur[1]=y1;
				mur[2]=x2;
				mur[3]=y2;

				//Chargement des objets oeuvres
				var oeuvres:XMLList=walls[i].Objects.object.(@type == "oeuvre");
				var vectOeuvres:Vector.<Object>=new Vector.<Object>;

				for (var j:int=0; j < oeuvres.length(); j++)
				{
					var tempArray:Array=new Array;
					var id:String=String(oeuvres[j].@id);
					var type:String=String(oeuvres[j].@type);
					var verticesOeuvre:XMLList=oeuvres[j].Vertix;
					var x1:Number=Number(verticesOeuvre[0].@x);
					var y1:Number=Number(verticesOeuvre[0].@y);
					var source:String=String(oeuvres[j].src);
					var desc:String=String(oeuvres[j].description);
					var sound:String;
					if (oeuvres[j].audio!=null){
						 sound=String(oeuvres[j].audio);
					}
					else
					{
						sound = "";
					}
					
					tempArray[0]=id;
					tempArray[1]=type;
					tempArray[2]=x1;
					tempArray[3]=y1;
					tempArray[4]=desc;
					tempArray[5]=source;
					tempArray[6]=sound;
					vectOeuvres.push(tempArray);
				}

				mur[4]=vectOeuvres;

				//Chargement des objets portes
				var portes:XMLList=walls[i].Objects.object.(@type == "porte");
				var vectPortes:Vector.<Object>=new Vector.<Object>;
				for (var j:int=0; j < portes.length(); j++)
				{
					var tempArray:Array=new Array;
					var id:String=String(portes[j].@id);
					var type:String=String(portes[j].@type);
					var verticesPortes:XMLList=portes[j].Vertix;
					var x1:Number=Number(verticesPortes[0].@x);
					var y1:Number=Number(verticesPortes[0].@y);
					var transition:XMLList=portes[j].Transition;
					var idTransition:String = String(transition[0].@id);

					tempArray[0]=id;
					tempArray[1]=type;
					tempArray[2]=x1;
					tempArray[3]=y1;
					tempArray[4]=idTransition;
					vectPortes.push(tempArray);
				}

				mur[5]=vectPortes;

				this._murs.push(mur);
			}

			this.dispatchEvent(new Event(XmlObject.CHARGEMENT_COMPLET));
		}

		/**
		 * Identifiant de la salle
		 */
		public function get id():String
		{
			return _id;
		}

		/**
		 * @private
		 */
		public function set id(value:String):void
		{
			_id = value;
		}

		/**
		 * Nom de la salle
		 */
		public function get name():String
		{
			return _name;
		}

		/**
		 * @private
		 */
		public function set name(value:String):void
		{
			_name = value;
		}

		/**
		 * Vecteur contenant tout les murs de la salle sous formes de tableau à quatre entrée
		 * <p>
		 *  [0] -> x1 |
		 *  [1] -> y1 |
		 * 	[2] -> x2 |
		 *  [3] -> y2
		 * </p>
		 * <p>
		 * 	[4] -> Vecteur d'oeuvres
		 * <p>
		 *   &#xA0; &#xA0;[0] -> id |
		 *  [1] -> type |
		 *  [2] -> x |
		 *  [3] -> y |
		 * 	[4] -> x2|
		 *  [5] -> y2|
		 * 	[6] -> description|
		 *  [7] -> src
		 * </p>
		 * </p>
		 * <p>
		 * 	[5] -> Vecteur de portes
		 * <p>
		 *   &#xA0; &#xA0;[0] -> id |
		 *  [1] -> type |
		 * 	[2] -> distance |
		 *  [3] -> x1 |
		 *  [4] -> y1 |
		 *  [5] -> x2 |
		 *  [6] -> y2
		 * </p>
		 * </p>
		 */
		public function get murs():Vector.<Object>
		{
			return _murs;
		}

		/**
		 * @private
		 */
		public function set murs(value:Vector.<Object>):void
		{
			_murs = value;
		}

		/**
		 * Position de départ de la caméra en x
		 */
		public function get x_camera():int
		{
			return _x_camera;
		}

		/**
		 * @private
		 */
		public function set x_camera(value:int):void
		{
			_x_camera = value;
		}

		/**
		 * Position de départ de la caméra en y 
		 */
		public function get y_camera():int
		{
			return _y_camera;
		}

		/**
		 * @private
		 */
		public function set y_camera(value:int):void
		{
			_y_camera = value;
		}


	}
}